home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2002 November / SGI IRIX Base Documentation 2002 November.iso / usr / share / catman / p_man / cat3 / SCSL / srand64.z / srand64
Encoding:
Text File  |  2002-10-03  |  19.4 KB  |  397 lines

  1.  
  2.  
  3.  
  4. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      ssssrrrraaaannnndddd66664444, ddddrrrraaaannnndddd66664444, ddddrrrraaaannnndddd66664444____aaaaddddvvvvaaaannnncccceeee, ddddrrrraaaannnndddd66664444____ggggeeeetttt, ddddrrrraaaannnndddd66664444____ggggeeeettttvvvv,
  10.      ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss, ddddrrrraaaannnndddd66664444____sssseeeetttt, ddddrrrraaaannnndddd66664444____sssseeeettttvvvv, ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd - Thread-
  11.      safe parallel 64-bit random number generator
  12.  
  13. SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  14.      Fortran synopsis:
  15.  
  16.           RRRREEEEAAAALLLL FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN SSSSRRRRAAAANNNNDDDD66664444 ((((_h_a_r_v_e_s_t))))
  17.           RRRREEEEAAAALLLL _h_a_r_v_e_s_t
  18.  
  19.           DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN DDDDRRRRAAAANNNNDDDD66664444 ((((_h_a_r_v_e_s_t))))
  20.           DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN _h_a_r_v_e_s_t
  21.  
  22.           SSSSUUUUBBBBRRRROOOOUUUUTTTTIIIINNNNEEEE DDDDRRRRAAAANNNNDDDD66664444____AAAADDDDVVVVAAAANNNNCCCCEEEE ((((_c_o_u_n_t))))
  23.           IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 _c_o_u_n_t
  24.  
  25.           SSSSUUUUBBBBRRRROOOOUUUUTTTTIIIINNNNEEEE DDDDRRRRAAAANNNNDDDD66664444____GGGGEEEETTTT ((((_s_e_e_d,,,, _c_o_u_n_t,,,, _t_h_r_e_a_d))))
  26.           IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 _s_e_e_d,,,, _c_o_u_n_t
  27.           IIIINNNNTTTTEEEEGGGGEEEERRRR _t_h_r_e_a_d
  28.  
  29.           SSSSUUUUBBBBRRRROOOOUUUUTTTTIIIINNNNEEEE DDDDRRRRAAAANNNNDDDD66664444____GGGGEEEETTTTVVVV ((((_s_t_a_t_e,,,, _c_o_u_n_t))))
  30.           IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 _s_t_a_t_e(*),,,, _c_o_u_n_t(*)
  31.  
  32.           IIIINNNNTTTTEEEEGGGGEEEERRRR FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN DDDDRRRRAAAANNNNDDDD66664444____MMMMAAAAXXXXTTTTHHHHRRRREEEEAAAADDDDSSSS (((())))
  33.  
  34.           SSSSUUUUBBBBRRRROOOOUUUUTTTTIIIINNNNEEEE DDDDRRRRAAAANNNNDDDD66664444____SSSSEEEETTTT ((((_s_e_e_d))))
  35.           IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 _s_e_e_d
  36.  
  37.           SSSSUUUUBBBBRRRROOOOUUUUTTTTIIIINNNNEEEE DDDDRRRRAAAANNNNDDDD66664444____SSSSEEEETTTTVVVV ((((_s_t_a_t_e,,,, _c_o_u_n_t))))
  38.           IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 _s_t_a_t_e(*),,,, _c_o_u_n_t(*)
  39.  
  40.           IIIINNNNTTTTEEEEGGGGEEEERRRR FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN DDDDRRRRAAAANNNNDDDD66664444____TTTTHHHHRRRREEEEAAAADDDD ((((_t_h_r_e_a_d))))
  41.           IIIINNNNTTTTEEEEGGGGEEEERRRR _t_h_r_e_a_d
  42.  
  43.      C/C++ synopsis:
  44.  
  45.           ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll....hhhh>>>>
  46.  
  47.           ffffllllooooaaaatttt ssssrrrraaaannnndddd66664444 ((((ffffllllooooaaaatttt *_h_a_r_v_e_s_t))));;;;
  48.  
  49.           ddddoooouuuubbbblllleeee ddddrrrraaaannnndddd66664444 ((((ddddoooouuuubbbblllleeee *_h_a_r_v_e_s_t))));;;;
  50.  
  51.           vvvvooooiiiidddd ddddrrrraaaannnndddd66664444____aaaaddddvvvvaaaannnncccceeee ((((lllloooonnnngggg lllloooonnnngggg _c_o_u_n_t))));;;;
  52.  
  53.           vvvvooooiiiidddd ddddrrrraaaannnndddd66664444____ggggeeeetttt ((((lllloooonnnngggg lllloooonnnngggg *_s_e_e_d, lllloooonnnngggg lllloooonnnngggg *_c_o_u_n_t, iiiinnnntttt _t_h_r_e_a_d))));;;;
  54.  
  55.           vvvvooooiiiidddd ddddrrrraaaannnndddd66664444____ggggeeeettttvvvv ((((lllloooonnnngggg lllloooonnnngggg _s_t_a_t_e[], lllloooonnnngggg lllloooonnnngggg _c_o_u_n_t[]))));;;;
  56.  
  57.           iiiinnnntttt ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss ((((vvvvooooiiiidddd))));;;;
  58.  
  59.  
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  71.  
  72.  
  73.  
  74.           vvvvooooiiiidddd ddddrrrraaaannnndddd66664444____sssseeeetttt ((((lllloooonnnngggg lllloooonnnngggg _s_e_e_d))));;;;
  75.  
  76.           vvvvooooiiiidddd ddddrrrraaaannnndddd66664444____sssseeeettttvvvv ((((lllloooonnnngggg lllloooonnnngggg _s_t_a_t_e[], lllloooonnnngggg lllloooonnnngggg _c_o_u_n_t[]))));;;;
  77.  
  78.           iiiinnnntttt ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd ((((iiiinnnntttt _t_h_r_e_a_d))));;;;
  79.  
  80. IIIIMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTTAAAATTTTIIIIOOOONNNN
  81.      These routines are part of the SCSL Scientific Library and can be loaded
  82.      using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option.  The ----llllssssccccssss____mmmmpppp option
  83.      directs the linker to use the multi-processor version of the library.
  84.  
  85.      When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is
  86.      4 bytes (32 bits). Another version of SCSL is available in which integers
  87.      are 8 bytes (64 bits). This version allows the user access to larger
  88.      memory sizes and helps when porting legacy Cray codes.  It can be loaded
  89.      by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option.  A program may
  90.      use only one of the two versions; 4-byte integer and 8-byte integer
  91.      library calls cannot be mixed.
  92.  
  93.      The C and C++ prototypes shown above are appropriate for the 4-byte
  94.      integer version of SCSL. When using the 8-byte integer version, the
  95.      variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____iiii8888....hhhh>>>> header file
  96.      should be included.
  97.  
  98. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  99.      These routines comprise a 64-bit thread-safe parallel random number
  100.      generator that is based on the linear congruent sequence
  101.  
  102.           Y(n+1) = (a X(n) + c) mod 2^64.
  103.  
  104.      The parameters a and c are chosen from Knuth, _T_h_e _A_r_t _o_f _C_o_m_p_u_t_e_r
  105.      _P_r_o_g_r_a_m_m_i_n_g , Vol. 2, 3rd edition, pp. 106-108:
  106.  
  107.           a = 6364136223846793005
  108.           c = 1
  109.  
  110.      Y(n+1) is then converted to a floating point value in the range [0,1).
  111.  
  112.      The thread safety is ensured by separating the RNG state for each thread.
  113.      Thus, each thread generates an independent random sequence starting from
  114.      predefined values.  Up to ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss(((()))) parallel streams of random
  115.      numbers can be supported simultaneously.
  116.  
  117.      ssssrrrraaaannnndddd66664444
  118.           This function returns a single precision random number in the range
  119.           [0,1); the same value is returned in the argument, if provided.
  120.  
  121.      ddddrrrraaaannnndddd66664444
  122.           This function returns a double precision random number in the range
  123.           [0,1); the same value is returned in the argument, if provided.
  124.  
  125.      ddddrrrraaaannnndddd66664444____aaaaddddvvvvaaaannnncccceeee
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  137.  
  138.  
  139.  
  140.           This routine advances the internal state table entries for the
  141.           calling thread as if ssssrrrraaaannnndddd66664444(((()))) or ddddrrrraaaannnndddd66664444(((()))) had been called _c_o_u_n_t
  142.           times.
  143.  
  144.      ddddrrrraaaannnndddd66664444____ggggeeeetttt
  145.           This routine obtains the starting point of ssssrrrraaaannnndddd66664444(((()))) and ddddrrrraaaannnndddd66664444(((()))),
  146.           as well as the invocation count for the thread specified in the
  147.           third argument.
  148.  
  149.      ddddrrrraaaannnndddd66664444____ggggeeeettttvvvv
  150.           This routine provides the internal state of ssssrrrraaaannnndddd66664444(((()))) and ddddrrrraaaannnndddd66664444(((()))).
  151.           The arguments are arrays of seeds and invocation counts that can be
  152.           given as arguments to ddddrrrraaaannnndddd66664444____sssseeeettttvvvv(((()))).  The array arguments must have
  153.           at least ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss(((()))) elements.
  154.  
  155.      ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss
  156.           This function returns the maximum number of random number streams
  157.           that can be generated in parallel.  The internal state tables used
  158.           in ddddrrrraaaannnndddd66664444____ggggeeeettttvvvv(((()))) and ddddrrrraaaannnndddd66664444____sssseeeettttvvvv(((()))) have ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss(((())))
  159.           entries.
  160.  
  161.      ddddrrrraaaannnndddd66664444____sssseeeetttt
  162.           This routine sets the starting point of ssssrrrraaaannnndddd66664444(((()))) and ddddrrrraaaannnndddd66664444(((()))).  By
  163.           default the generator is initialized to -1.
  164.  
  165.      ddddrrrraaaannnndddd66664444____sssseeeettttvvvv
  166.           This routine sets the internal state of ssssrrrraaaannnndddd66664444(((()))) and ddddrrrraaaannnndddd66664444(((()))).
  167.           The arguments are arrays of seeds and invocation counts, as returned
  168.           by ddddrrrraaaannnndddd66664444____ggggeeeettttvvvv, for example.  The array arguments must have
  169.           ddddrrrraaaannnndddd66664444____mmmmaaaaxxxxtttthhhhrrrreeeeaaaaddddssss(((()))) elements.
  170.  
  171.      ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd
  172.           After a call this routine, the next invocations of ssssrrrraaaannnndddd66664444(((()))) and
  173.           ddddrrrraaaannnndddd66664444(((()))) will have the same effect as if called from the base
  174.           thread number specified in the argument to ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd(((()))).
  175.  
  176.           This function returns the base thread number that had previously
  177.           been generating the random sequence.
  178.  
  179. EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS
  180.      Below are several usage examples for RRRRAAAANNNNDDDD66664444 routines.
  181.  
  182.      Example 1:  Initialize the internal RNG state table with a single seed
  183.      value and generate a random number for each thread.
  184.  
  185.      Fortran 77:
  186.  
  187.                 EXTERNAL SRAND64
  188.                 REAL SRAND64
  189.                 INTEGER*8 SEED
  190.                 REAL S1, DUMMY
  191.                 SEED = 1
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  203.  
  204.  
  205.  
  206.                 CALL DRAND64_SET(SEED)
  207.           C Each thread gets a different random number
  208.           C$OMP PARALLEL PRIVATE(S1, DUMMY)
  209.                 S1 = SRAND64(DUMMY)
  210.           C$OMP END PARALLEL
  211.  
  212.  
  213.      C/C++:
  214.  
  215.           #include <scsl.h>
  216.           float s1, dummy;
  217.           long long seed = 1LL;
  218.           drand64_set(seed);
  219.           /* Each thread gets a different random number */
  220.           #pragma omp parallel private(s1, dummy)
  221.           {
  222.             s1 = srand64(&dummy);
  223.           }
  224.  
  225.  
  226.      Example 2:  After saving the RNG state table, generate 11 random numbers
  227.      for each thread.  Then restore the state table and use ddddrrrraaaannnndddd66664444____aaaaddddvvvvaaaannnncccceeee(((())))
  228.      to "skip" 10 random numbers.  The next random number generated for each
  229.      thread should be identical to the 11th value from the original stream.
  230.  
  231.      Fortran 90:
  232.  
  233.           INTEGER(KIND=8), DIMENSION(:), ALLOCATABLE :: STATE, COUNT
  234.           EXTERNAL DRAND64_MAXTHREADS, OMP_GET_THREAD_NUM, DRAND64
  235.           INTEGER :: I, TABLE_SIZE, DRAND64_MAXTHREADS, OMP_GET_THREAD_NUM
  236.           REAL(KIND=8) :: D1, DUMMY, DRAND64
  237.           TABLE_SIZE = DRAND64_MAXTHREADS()
  238.           ALLOCATE(STATE(TABLE_SIZE))
  239.           ALLOCATE(COUNT(TABLE_SIZE))
  240.           CALL DRAND64_GETV(STATE, COUNT)
  241.           !$OMP PARALLEL PRIVATE(I, D1, DUMMY)
  242.           DO I = 1, 11
  243.             D1 = DRAND64(DUMMY)
  244.           END DO
  245.           PRINT *, OMP_GET_THREAD_NUM(), D1
  246.           !$OMP END PARALLEL
  247.           CALL DRAND64_SETV(STATE, COUNT)
  248.           !$OMP PARALLEL PRIVATE(D1, DUMMY)
  249.           DRAND64_ADVANCE(10_8)
  250.           D1 = DRAND64(DUMMY)
  251.           PRINT *, OMP_GET_THREAD_NUM(), D1
  252.           !$OMP END PARALLEL
  253.  
  254.  
  255.      C/C++:
  256.  
  257.           #include <scsl.h>
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  269.  
  270.  
  271.  
  272.           #include <omp.h>
  273.           #include <stdlib.h>
  274.           #include <stdio.h>
  275.           long long *state, *count;
  276.           int i, table_size;
  277.           double d1, dummy;
  278.           table_size = drand64_maxthreads();
  279.           state = (long long *) malloc(table_size * sizeof(long long));
  280.           count = (long long *) malloc(table_size * sizeof(long long));
  281.           drand64_getv(state, count);
  282.           #pragma omp parallel private(i, d1, dummy)
  283.           {
  284.             for (i = 0; i < 11; i++)
  285.               d1 = drand64(&dummy);
  286.             printf("%d, %g0, omp_get_thread_num(), d1);
  287.           }
  288.           drand64_setv(state, count);
  289.           #pragma omp parallel private(d1, dummy)
  290.           {
  291.             drand64_advance(10LL);
  292.             d1 = drand64(&dummy);
  293.             printf("%d, %g0, omp_get_thread_num(), d1);
  294.           }
  295.  
  296.  
  297.      Example 3:  Using only a single thread, generate 10 independent streams
  298.      of random numbers.
  299.  
  300.      Fortran 77:
  301.  
  302.                 EXTERNAL DRAND64_THREAD, SRAND64
  303.                 INTEGER DRAND64_THREAD
  304.                 REAL SRAND64
  305.                 INTEGER I, J, OLDID
  306.                 REAL STREAM(1000,10), DUMMY
  307.                 DO J = 1, 10
  308.                   OLDID = DRAND64_THREAD(J-1)
  309.                   DO I = 1, 1000
  310.                     STREAM(I, J) = SRAND64(DUMMY)
  311.                   END DO
  312.                 END DO
  313.           C RESTORE ORIGINAL BASE THREAD
  314.                 OLDID = DRAND64_THREAD(0)
  315.  
  316.  
  317.      C/C++:
  318.  
  319.           #include <scsl.h>
  320.           int i, j, oldid;
  321.           float stream[10][1000], dummy;
  322.           for (i = 0; i < 10; i++) {
  323.             oldid = drand64_thread(i);
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))                                                        SSSSRRRRAAAANNNNDDDD66664444((((3333SSSS))))
  335.  
  336.  
  337.  
  338.             for (j = 0; j < 1000; j++)
  339.               stream[i][j] = srand64(&dummy);
  340.           }
  341.           /* restore original base thread */
  342.           oldid = drand64_thread(0);
  343.  
  344.  
  345. CCCCAAAAUUUUTTTTIIIIOOOONNNNSSSS
  346.      Care is required when using ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd(((()))) in parallel regions.  If
  347.      multiple parallel threads possess the same RRRRAAAANNNNDDDD66664444 base thread number as
  348.      assigned with a call to ddddrrrraaaannnndddd66664444____tttthhhhrrrreeeeaaaadddd(((()))), then thread safety will be
  349.      compromised, with different threads no longer producing independent
  350.      random sequences.  The statistical randomness of the resulting individual
  351.      sequences will also likely be degraded.
  352.  
  353. SSSSEEEEEEEE AAAALLLLSSSSOOOO
  354.      IIIINNNNTTTTRRRROOOO____SSSSCCCCSSSSLLLL(3S), DDDDRRRRAAAANNNNDDDD44448888(3C)
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.                                                                         PPPPaaaaggggeeee 6666
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.